package br.edu.ufcg.dsc.lp2.projeto.tests.model;

import org.junit.Before;
import org.junit.Assert;
import org.junit.Test;

import br.edu.ufcg.dsc.lp2.projeto.model.Estabelecimento;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EnderecoInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NomeInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.NullParameterException;

public class EstabelecimentoTest {
		
	@Before
	public void setUp() {
		this.spolletoEstabelecimento = new Estabelecimento("Spolleto", 
				"Shopping Boulevard", "A la carte");
		girassolEstabelecimento = new Estabelecimento("Girassol", 
                "R Irineu Joffily 263 - Centro", "Self-service"); 
	}
	
	@Test
	public void testGets() {
		Assert.assertEquals("Girassol", girassolEstabelecimento.getNome());
		Assert.assertEquals("R Irineu Joffily 263 - Centro", 
				girassolEstabelecimento.getEndereco());
		Assert.assertEquals(0, spolletoEstabelecimento.getPopularidade());
		Assert.assertEquals("A la carte", spolletoEstabelecimento.getTipoDeAlmoco());
	} 
	
	
	@Test(expected = NomeInvalidoException.class)
	public void testNomeNull() {
		new Estabelecimento(null, "Rua das amoras, 555", "Self-service");
	}
	
	@Test(expected = NomeInvalidoException.class)
	public void testNomeVazio() {
		new Estabelecimento("", "Rua das amoras, 555", "Self-service");
	}
	
	@Test(expected = EnderecoInvalidoException.class)
	public void testEnderecoNull() {
		new Estabelecimento("Exemplo de nome", null, "Self-service");
	}
	
	@Test(expected = EnderecoInvalidoException.class)
	public void testEnderecoVazio() {
		new Estabelecimento("Exemplo de nome", "", "Self-service");
	}
	
	@Test(expected = NullParameterException.class)
	public void testTipoDeAlmocoNull() {
		new Estabelecimento("Exemplo de nome", "Rua das amoras, 555", null);
	}
	
	@Test(expected = NullParameterException.class)
	public void testTipoDeAlmocoVazio() {
		new Estabelecimento("Exemplo de nome", "Rua das amoras, 555", "");
	}
	
	
	@Test
	public void testVotar() {
		spolletoEstabelecimento.votar(4);
		Assert.assertEquals(4, spolletoEstabelecimento.getPopularidade());
		spolletoEstabelecimento.votar(-1);
		Assert.assertEquals(3, spolletoEstabelecimento.getPopularidade());
	}
	
	@Test
	public void testaPopularidade(){
		//votacao spolletoEstabelecimento (mais popular)
		spolletoEstabelecimento.votar(5);
		spolletoEstabelecimento.votar(2);
		spolletoEstabelecimento.votar(0);
		
		//votacao girassolEstabelecimento (menos popular)
		girassolEstabelecimento.votar(-5);
		girassolEstabelecimento.votar(-5);
		girassolEstabelecimento.votar(-5);
		girassolEstabelecimento.votar(-5);
		girassolEstabelecimento.votar(-5);
		girassolEstabelecimento.votar(-1);
		
		Assert.assertEquals("Erro de popularidade 1",7, 
		        spolletoEstabelecimento.getPopularidade());
		Assert.assertEquals("Erro de popularidade 2",-26, 
		        girassolEstabelecimento.getPopularidade());
	}
	
	@Test
	public void testToString() {
		final String fimDeLinha = System.getProperty("line.separator");
		
		Assert.assertEquals("Spolleto" + fimDeLinha + "Endereco: Shopping Boulevard" + fimDeLinha + "Tipo de almoco: A la carte",
				spolletoEstabelecimento.toString());
	}
	
	private Estabelecimento spolletoEstabelecimento;
	private Estabelecimento girassolEstabelecimento;
}